﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;

namespace KPWeb.Data
{
    public class Dokumenty
    {
        public static IEnumerable<vKP_DokumentyPrzyjete> GetDokumentyPrzyjete(int firmaID)
        {
            using (DBContainer db = new DBContainer())
            {
                //nie wyświetlamy dokumentów active='f' lub stan=255
                return (from wiz in db.vKP_DokumentyPrzyjete.Where(a => a.FirmaID == firmaID).OrderByDescending(a => a.DataPrzyjecia) select wiz).ToArray();
            }
        }


        public static int UpdateDokumentyPrzyjete(int dokPrzyjID, byte stan1, byte stan2)
        {

            using (DBContainer db = new DBContainer())
            {
                try
                {
                    var wiz = db.KP_DokumentyPrzyjete.Where(a => a.DokPrzyjID == dokPrzyjID && a.Stan == stan1).Single();
                    wiz.Stan = stan2;

                    db.SaveChanges();
                    return 0;
                }
                catch (Exception e)
                {
                    return 1;
                }

            }
        }
        public static int InsertDokumentyPrzyjete(byte typDokumentuID, int? osobaID, int dokumentID,
            int uprawnieniaID, DateTime dataPrzyjecia, byte stan)
        //>0 ID utworzonego dokumentu OK
        //-1 błąd zapisu
        {
            using (DBContainer db = new DBContainer())
            {
                try
                {
                    KP_DokumentyPrzyjete e = new KP_DokumentyPrzyjete();
                    e.OsobaID = osobaID;
                    e.TypDokumentuID = typDokumentuID;
                    e.DokumentID = dokumentID;
                    e.UprawnieniaID = uprawnieniaID;
                    e.DataPrzyjecia = dataPrzyjecia;
                    e.Stan = stan;
                    e.active = "t";
                    db.KP_DokumentyPrzyjete.AddObject(e);

                    int a = db.SaveChanges();
                    return e.DokPrzyjID;
                }
                catch (Exception e)
                {
                    return -1;
                }

            }
        }

        public static int AnulujDokumentyPrzyjete(int dokPrzyjID)
        {
            //0 OK,1 błąd operacji anulowania
            using (DBContainer db = new DBContainer())
            {
                try
                {
                    var wiz = db.KP_DokumentyPrzyjete.Where(a => a.DokPrzyjID == dokPrzyjID).Single();
                    wiz.active = "f";

                    db.SaveChanges();
                    return 0;
                }
                catch (Exception e)
                {
                    return 1;
                }

            }
        }
        public static int DeleteDokumentyPrzyjete(int dokPrzyjID)
        {
            //1 błąd operacji kasowania
            using (DBContainer db = new DBContainer())
            {
                try
                {
                    db.KP_DokumentyPrzyjete.DeleteObject(db.KP_DokumentyPrzyjete.Where
                              (a => a.DokPrzyjID == dokPrzyjID).Single());
                    db.SaveChanges();
                    return 0;
                }
                catch (Exception e)
                {
                    return 1;
                }


            }
        }


        public static int InsertDokumentyPrzyjeteTransact(byte typDokumentuID, int? osobaID, int dokumentID,
                   int uprawnieniaID, DateTime dataPrzyjecia, byte stan)
        //>0 ID utworzonego dokumentu OK
        //-1 błąd zapisu
        {
            System.Data.Common.DbTransaction trans = null;
            using (DBContainer db = new DBContainer())
            {

                try
                {
                    int? dokPrzyjID = 0;

                    db.Connection.Open();//Michał

                    trans = db.Connection.BeginTransaction();




                    KP_DokumentyPrzyjete e = new KP_DokumentyPrzyjete();
                    e.OsobaID = osobaID;
                    e.TypDokumentuID = typDokumentuID;
                    e.DokumentID = dokumentID;
                    e.UprawnieniaID = uprawnieniaID;
                    e.DataPrzyjecia = dataPrzyjecia;
                    e.Stan = stan;
                    e.active = "t";
                    db.KP_DokumentyPrzyjete.AddObject(e);

                    db.SaveChanges();
                    dokPrzyjID = e.DokPrzyjID;


                    if (typDokumentuID==2)
                    {
                        vKP_DrukWniosekUrlopowy iTemp = UrlopyK.GetDrukWniosekUrlopowy(dokumentID).First();
                       for (DateTime d=iTemp.OdData;d<=iTemp.DoData;d = d.AddDays(1)) 
                       {

                           KP_Nieobecnosci n = new KP_Nieobecnosci();
                           n.DokumentID = dokumentID;
                           n.OsobaID =(int) osobaID;
                           n.Date = d;
                           n.Year = short.Parse(d.Year.ToString());
                           n.TypNieobecnosciUrlopu = iTemp.TypNieobecnosciUrlopuID;
                           n.Stan = 2;
                           n.active = "t";
                           db.KP_Nieobecnosci.AddObject(n);
                           db.SaveChanges();
                       }

                   }





                    //dokPrzyjID = InsertDokumentyPrzyjete(typDokumentuID, osobaID, dokumentID,
                    //                   uprawnieniaID, dataPrzyjecia, stan);


                    int outProc = UrlopyK.UpdateWniosekUrlopowy(dokumentID, 5, 6);
                    if (outProc != 0)
                    {
                        if (trans != null)
                            trans.Rollback();
                        return -1;
                    }
                    trans.Commit();
                    return 0;

                }
                catch (Exception ex)
                {
                    if (trans != null)
                        trans.Rollback();
                    return -1;
                }
                finally
                {
                    if (db.Connection.State == ConnectionState.Open)//Michał
                        db.Connection.Close();//Michał
                }

            }
        }


    }
}